frontend/pages/e/[uuid]/waitingList.tsx (view raw)
1import {useState, useMemo, PropsWithChildren, useReducer} from 'react';
2import useProfile from '../../../hooks/useProfile';
3import WaitingList from '../../../containers/WaitingList';
4import pageUtils from '../../../lib/pageUtils';
5import EventLayout, {TabComponent} from '../../../layouts/Event';
6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
7import {EventByUuidDocument} from '../../../generated/graphql';
8import {getLocaleForLang} from '../../../lib/getLocale';
9
10interface Props {
11 eventUUID: string;
12 announcement?: string;
13}
14
15const Page = (props: PropsWithChildren<Props>) => {
16 return <EventLayout {...props} Tab={WaitingListTab} />;
17};
18
19const WaitingListTab: TabComponent<Props> = ({event}) => {
20 const {userId} = useProfile();
21 const [dialogOpen, toggleDialog] = useReducer(i => !i, false);
22 const [isSelfAdd, setIsSelfAdd] = useState(false);
23
24 const registered = useMemo(() => {
25 if (!userId) return false;
26 const isInWaitingList = event?.waitingPassengers?.data?.some(
27 passenger => passenger.attributes.user?.data?.id === `${userId}`
28 );
29 return isInWaitingList;
30 }, [event, userId]);
31
32 return (
33 <>
34 <WaitingList
35 registered={registered}
36 canAddSelf={!!userId}
37 onAddSelf={() => {
38 setIsSelfAdd(true);
39 toggleDialog();
40 }}
41 onAddOther={() => {
42 setIsSelfAdd(false);
43 toggleDialog();
44 }}
45 />
46 <AddPassengerToWaitingList
47 open={dialogOpen}
48 toggle={toggleDialog}
49 addSelf={isSelfAdd}
50 />
51 </>
52 );
53};
54
55export const getServerSideProps = pageUtils.getServerSideProps(
56 async (context, apolloClient) => {
57 const {uuid} = context.query;
58 const {host = ''} = context.req.headers;
59 let event = null;
60
61 // Fetch event
62 try {
63 const {data} = await apolloClient.query({
64 query: EventByUuidDocument,
65 variables: {uuid},
66 });
67 event = data?.eventByUUID?.data;
68 } catch (error) {
69 return {
70 notFound: true,
71 };
72 }
73
74 const isCarosterPlus =
75 event?.attributes?.enabled_modules?.includes('caroster-plus');
76 if (isCarosterPlus)
77 return {
78 notFound: true,
79 };
80
81 const description = await getLocaleForLang(
82 event?.attributes?.lang,
83 'meta.description'
84 );
85
86 return {
87 props: {
88 eventUUID: uuid,
89 metas: {
90 title: event?.attributes?.name || '',
91 description,
92 url: `https://${host}${context.resolvedUrl}`,
93 },
94 },
95 };
96 }
97);
98
99export default Page;